//闭包  传入当前环境的this
(function (global, factory) {
    //1.先判断当前环境是否支持CommonJS规范(node.js)
    if (typeof exports == 'object' && typeof module !== 'undefined') {
        module.exports = factory()
    } else if (typeof define == 'function' && define.amd) {//2.再判断是否支持AMD规范(require.js)
        define(factory)
    } else {
        //接收该对象
        this.xlsxTojson = factory()
    }
}(this,function(){

    //将文件转换成json
    //参数1：必填，表格文件
    //参数2：必填，列配置
    //参数3：可选，配置项

    //表格导入有3种格式
    //1.不带表头
    //2.带表头(英文)
    //3.带表头(中文)
    function xlsxTojson(file, options = {}){
        //SheetName，默认读第一个
        var SheetName = options.SheetName
        //如果文件存在 则读取
        if(file){
            //创建reader对象
            var reader = new FileReader()
            //读取选择的文件
            reader.readAsBinaryString(file)

            //监听读取事件
            reader.onload = function(ev){
                const data = ev.target.result
                //转换book对象
                const workbook = XLSX.read(data, { type: 'binary' })
                if(!SheetName){
                    SheetName = workbook.SheetNames[0]
                }
                //将某个sheet转换成csvData 注意 sheet 的名称
                const csvData = XLSX.utils.sheet_to_csv(workbook.Sheets[SheetName])
                //将csv转换成json
                var tableData = csvToJson(csvData, options)
                //alert('请打开控制台查看JSON')
                console.log(tableData)
            }
        }else{
            console.log('请传入文件')
        }
    }

    //将csv数据转换为json数据
    //如果没有表头，则所有行视为表体，输出的json为二维数组
    //如果有表头，第一行视为表头信息，其他行为表体信息
    function csvToJson(csvData, options = {}){
        //是否有表头
        var Thead = options.Thead
        //表头信息（有表头必须配置）
        var TheadConfig = options.TheadConfig

        const tableData = []
        var headData = []
        var bodyData = []
        // 解析csvData数据
        csvData.split('\n').forEach((vRow,vindex) => {
            //过滤空数据
            if(vRow){
                //表头数据（有表头且是第一行）
                if(Thead && vindex == 0){
                    headData = vRow.split(",")
                }else{
                    bodyData.push(vRow)
                }
            }
        })
        //进一步解析（一行）
        bodyData.forEach((rowStr=>{
            //没有表头的话，不要key，直接装入数组
            if(!Thead){
                var row = rowStr.split(",")
            }else{
                //有自定义表头，进行陪陪

                var row = {}
                rowStr.split(',').forEach((value, columnIndex)=>{
                    ///有表头，但是没有自定义表头配置，把表头数据当作key进行处理
                    //有自定义表头，则进行转换
                    if(TheadConfig){
                        //有自定义表头，则进行转换
                        var key = findKey(headData, TheadConfig, columnIndex)
                    }else{
                        ///没有自定义表头配置，把表头数据当作key进行处理
                        var key = headData[columnIndex]
                    }
                    row[key] = value
                })
            }

            tableData.push(row)
        }))
        return tableData
    }

    //根据下标找到对应的表头配置
    function findKey(headData, TheadConfig, index){
        var value = headData[index]
        var result = value
        //找到值对应的key
        Object.keys(TheadConfig).forEach(key=>{
            if(TheadConfig[key] == value){
                result = key
            }
        })
        return result
    }

    return xlsxTojson;
}))